📌Oracle ORA-00904: "FALSE": 無效的 ID 解析與 C# EF Core LINQ to Entities 錯誤排查教學

Oracle ORA-00904: "FALSE": 無效的 ID 解析與 C# EF Core LINQ to Entities 錯誤排查教學

【教學】Oracle ORA-00904: "FALSE": 無效的 ID ─ C# EF Core LINQ 錯誤排查完全解析

快速導讀:這篇將說明你在 C# .NET 專案,使用 Entity Framework Core 操作 Oracle 資料庫時,遇到 ORA-00904: "FALSE": 無效的 ID 這個經典錯誤的主因,並用實例教你怎麼改,從原理、症狀、最佳解決方案到防呆技巧一次整理給你!

什麼是 ORA-00904: "FALSE": 無效的 ID?

這是 Oracle Database 的一個經典 SQL 錯誤,意思是你的 SQL 查詢裡面用了資料庫「不認識」的欄位或語法。
例如直接在 SQL 裡寫 SELECT ... WHERE ... AND FALSEORDER BY TRUE,Oracle 會直接噴錯:
ORA-00904: "FALSE": invalid identifier(無效的識別字)

實務開發情境 ─ C#、EF Core、LINQ to Entities 怎麼踩雷?

當你在 .NET 專案裡用 LINQ 查詢時,如果你直接在查詢條件用 C# 的 truefalse,這些語法會被翻成 SQL 執行。
但 Oracle SQL 並不認得 TRUEFALSE 這種布林值 literal,只接受 1/0 或 'Y'/'N' 這種設計。

  // 錯誤寫法:會產生 ORA-00904
  var query = from x in db.MyTable
              where x.Status == "Active" && false
              select x;
  

這樣會在 Oracle SQL 被翻譯成 ... AND FALSE,直接觸發錯誤。

常見踩雷點

  • LINQ Where、OrderBy、Select 等查詢條件中直接用 truefalse
  • 三元運算 someCondition ? "Y" : falseNG!
  • 預設值直接設 falsetrue

怎麼修?正確寫法一次看

  1. 所有查詢條件都必須用「可轉成資料庫可辨識的型別」:
    • 字串:""
    • 數字:0
    • 資料庫設計欄位(如 'Y'/'N', 1/0)
  2. 千萬別在 LINQ 查詢裡用 falsetrue
  3. 三元運算請回傳字串或數字,不要回傳 C# 布林值:
          // 錯誤
          select new {
              Flag = isOK ? "Y" : false  // NG!
          }
          // 正確
          select new {
              Flag = isOK ? "Y" : "N"
          }
          
  4. 條件過濾建議這樣寫:
          // 假設 IS_VALID 是 'Y' / 'N'
          .Where(x => x.IS_VALID == "Y")
          // 如果要所有資料
          //.Where(x => true)    // 這樣沒意義且在 Oracle 也不保證一定過
          

實務除錯步驟(新手照做也不會錯)

  1. 全專案搜尋 falsetrue,檢查有無出現在 LINQ 查詢裡
  2. 任何查詢的 Select、Where、OrderBy、GroupBy 裡出現布林值,**改成字串或數字**
  3. 三元運算回傳請寫 """Y""N"0,不要寫 C# 的 false

真實案例:同事問我為何 Oracle Entity Framework 會噴 "FALSE" 無效的 ID?

某天專案在 GenerateAPSZRESULTC 方法加新欄位後,後端呼叫就爆 ORA-00904: "FALSE": 無效的 ID
原始寫法(踩雷範例):

  select new APSZRESULTC {
      ...,
      ORI_PLAN_WEEK = z.ORI_PLAN_WEEK ?? false, // NG!
  }
  

改成這樣就沒問題:

  select new APSZRESULTC {
      ...,
      ORI_PLAN_WEEK = z.ORI_PLAN_WEEK ?? ""
  }
  

結論:Oracle Entity Framework 查詢禁止用 C# 布林值

只要看到 ORA-00904: "FALSE": 無效的 ID,就代表你查詢裡有用到 falsetrue。請將所有欄位、條件轉換為資料庫可理解的資料型別,這樣你的查詢就會正常執行!

延伸閱讀


如果你喜歡這篇,歡迎 訂閱分享 給同事,更多 .NET 與資料庫排錯技巧,持續更新中!

留言

這個網誌中的熱門文章

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題

🛠【實戰排除教學】從 VS Code 的 _logger 錯誤,到 PowerShell 找不到 npm/serve,再到 Oracle ORA-03135 連線中斷——一次搞懂!

🔎如何在 Oracle PL/SQL 儲存過程中為文字欄位加入換行符號(CHR(10))——以 Updlcmremark 為例